// CRC16 计算函数
function calculateCRC(buffer) {
    let crc = 0xFFFF;
    for (let pos = 0; pos < buffer.length; pos++) {
        crc ^= buffer[pos];
        for (let i = 8; i !== 0; i--) {
            if ((crc & 0x0001) !== 0) {
                crc >>= 1;
                crc ^= 0xA001;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}

// 获取传入的 Buffer 数据
let buffer = msg.payload;

// 假设 CRC 是报文的最后两个字节
let receivedCRC = buffer.readUInt16LE(buffer.length - 2);

// 计算报文的 CRC（不包括最后两个字节）
let calculatedCRC = calculateCRC(buffer.slice(0, -2));

// 校验 CRC
if (calculatedCRC !== receivedCRC) {
    node.error("CRC check failed", msg);
    return null; // CRC 校验失败，停止处理
}

// 继续处理报文（假设功能码在第一个字节）
let functionCode = buffer.readUInt8(0);

// 解析数据长度（假设数据长度在第二个字节）
let dataLength = buffer.readUInt8(1);

// 解析数据内容（假设数据从第三个字节开始）
let data = buffer.slice(2, 2 + dataLength);

// 解析寄存器值（假设是16位寄存器）
let registerValue = data.readUInt16BE(0);

// 将解析后的数据放入 msg 对象中
msg.functionCode = functionCode;
msg.dataLength = dataLength;
msg.registerValue = registerValue;

// 返回消息对象
return msg;
